//Reflect 属性,多数时候会与 proxy 配合进行使用在 MDN Proxy 的例子中，Reflect 也有对此出现。

// const obj = {
//   name: '张三',
// };

// console.log(obj.name); // 张三
// console.log(Reflect.get(obj, 'name')); // 张三

//如果target对象中指定了getter，receiver则为getter调用时的this值。
// const p1 = {
//   lastName: '张',
//   firstName: '三',
//   // 通过 get 标识符标记，可以让方法的调用像属性的调用一样
//   get fullName() {
//     return this.lastName + this.firstName;
//   },
// };

// const p2 = {
//   lastName: '李',
//   firstName: '四',
//   // 通过 get 标识符标记，可以让方法的调用像属性的调用一样
//   get fullName() {
//     return this.lastName + this.firstName;
//   },
// };

// console.log(p1.fullName); // 张三
// console.log(Reflect.get(p1, 'fullName')); // 张三
// // 第三个参数 receiver 在对象指定了 getter 时表示为 this
// console.log(Reflect.get(p1, 'fullName', p2)); // 李四

//此时 getter 应该被触发 3 次！ ，但是 实际只触发了 1 次！ 。为什么？
// this 是 p1 ，而非 proxy ！所以 lastName 和 firstName 的触发，不会再次触发 getter。
// const p1 = {
//   lastName: '张',
//   firstName: '三',
//   // 通过 get 标识符标记，可以让方法的调用像属性的调用一样
//   get fullName() {
//     return this.lastName + this.firstName;
//   },
// };

// const proxy = new Proxy(p1, {
//   // target：被代理对象
//   // receiver：代理对象
//   get(target, key, receiver) {
//     console.log('触发了 getter');
//     return target[key];
//   },
// });

// console.log(proxy.fullName);

const proxy = new Proxy(p1, {
  // target：被代理对象
  // receiver：代理对象
  get(target, key, receiver) {
    console.log('触发了 getter');
    // return target[key]
    return Reflect.get(target, key, receiver);
  },
});

